package xml;

import org.jdom.*;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Verwaltet XML Eintraege in Bezug auf das Speichern von Rezepten.
 * Stellt ein Interface die gui-Klassen AddRecipeX dar.
 * @author Dominik Korittki
 * 
 */
public class XMLRecipeSaver extends XML {
	/**
	 * Konstruiert ein Saver-Objekt zum Speichern von Rezepten
	 * @param file	Dateiname der zu konstruierenden XML-Datei
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	public XMLRecipeSaver(File file) throws JDOMException, IOException {
		super(file);
	}

	/**
	 * Haengt ein neues Rezept-Element an die XML an
	 * @param identifier	ID
	 * @param name			Name
	 * @param ing			Zutatenliste
	 * @param cat1			1. Kategoerie
	 * @param cat2			2. Kategoerie
	 * @param cat3			3. Kategoerie
	 * @param prep			Zubereitungstext
	 * @param imagename		Bilddateiname
	 * @param thumbnailname	Thumbnaildateiname
	 * @param rat			Bewertung
	 * @param cntPeople		Anzahl der Personen
	 * @param t				Tags
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	@SuppressWarnings("unchecked")
	public boolean add(int identifier, String name, ArrayList<String> ing, String cat1, String cat2, String cat3, String prep, 
			String imagename, String thumbnailname, int rat, int cntPeople, String t) throws JDOMException, IOException {
				
		update();
		
		//Auf doppelte Eintrage pruefen
		List<Element>componentList = new ArrayList<Element>();
		componentList = (List<Element>)root.getChildren("recipe");
		for(Element el : componentList) {
			if(el.getChild("name").getText().equals(name)) return false;
		}
		
		System.out.println(root.getChildren());
		Element recipe = new Element("recipe");
		Element id = new Element("id");
		Element recipename = new Element("name");
		Element ingredients = new Element("ingredients");
		Element category1 = new Element("category1");
		Element category2 = new Element("category2");
		Element category3 = new Element("category3");
		Element preperation = new Element("preperation");
		Element imgname = new Element("imgname");
		Element thumbname = new Element("thumname");
		Element rating = new Element("rating");
		Element countPeople = new Element("countPeople");
		Element tags = new Element("tags");
		
		id.setText("" + identifier);
		recipename.setText(name);
		category1.setText(cat1);
		category2.setText(cat2);
		category3.setText(cat3);
		preperation.setText(prep);
		imgname.setText(imagename);
		thumbname.setText(thumbnailname);
		rating.setText("" + rat);
		countPeople.setText("" + cntPeople);
		tags.setText(t);
		
		for(int i=0; i<ing.size(); i++) {
			Element subing = new Element("ingredient");
			subing.setText(ing.get(i));
			ingredients.addContent(subing);
		}
		
		recipe.addContent(id);
		recipe.addContent(recipename);
		recipe.addContent(ingredients);
		recipe.addContent(category1);
		recipe.addContent(category2);
		recipe.addContent(category3);
		recipe.addContent(preperation);
		recipe.addContent(imgname);
		recipe.addContent(thumbname);
		recipe.addContent(rating);
		recipe.addContent(countPeople);
		recipe.addContent(tags);
		
		//An die Wurzel haengen
		root.addContent(recipe);
		createXMLFile();
		return true;
	}
	
	/**
	 * Ersetzt einen Rezepteintrag in der XML anhand der ID
	 * @param remID				ID des zu ersetzenden Elements
	 * @param newName			neuer Name
	 * @param newIng			neue Zutatenliste
	 * @param newCat1			neue 1. Kategoerie
	 * @param newCat2			neue 2. Kategoerie
	 * @param newCat3			neue 3. Kategoerie
	 * @param newPrep			neuer Zubereitungstext
	 * @param newImagename		neuer Bilddateiname
	 * @param newThumbnailname	neuer Thumbnaildateiname
	 * @param newRat			neue Bewertung
	 * @param newCntPeople		neue Anzahl der Personen
	 * @param newT				neue Tags
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	@SuppressWarnings("unchecked")
	public void replace(String remID, String newName, ArrayList<String> newIng, String newCat1, String newCat2, String newCat3, String newPrep, 
			String newImagename, String newThumbnailname, int newRat, int newCntPeople, String newT) throws JDOMException, IOException {
		update();							//Wurzel aktualisieren
		List<Element>componentList = new ArrayList<Element>();		//neue Liste fuer XML-Elemente anlegen
		componentList = (List<Element>)root.getChildren("recipe");	//alle Children der Wurzel in Liste schreiben zur Bearbeitung 
		
		componentList.remove(getIndex(remID));	//Indexpos. des zu entfernenden Elements in XML ermitteln und aus Liste loeschen
		root.removeContent();				//und alle Child-Elemente entfernen = XML leer
		createXMLFile();
		System.out.println(root.getChildren());
		
		for (Element comp : componentList) {
			List<Element>ingList = new ArrayList<Element>();
			ingList = (List<Element>)comp.getChildren("ingredients");
			ArrayList<String>ingr = new ArrayList<String>();
			
			int id = Integer.parseInt(comp.getChildText("id"));
			String name = comp.getChildText("name"); 
			for (Element ing : ingList) {
				ingr.add(ing.getChildText("ingredient"));
			}
			String cat1 = comp.getChildText("category1"); 
			String cat2 = comp.getChildText("category2"); 
			String cat3 = comp.getChildText("category3"); 
			String prep = comp.getChildText("preperation"); 
			String imgname = comp.getChildText("imgname"); 
			String thumname = comp.getChildText("thumname"); 
			int rat = Integer.parseInt(comp.getChildText("rating")); 
			int people = Integer.parseInt(comp.getChildText("countPeople")); 
			String tags = comp.getChildText("tags"); 

			//neuen Listeninhalt in XML schreiben
			add(id,name,ingr,cat1,cat2,cat3,prep,imgname,thumname,rat,people,tags);		
		}
		add(Integer.parseInt(remID), newName, newIng, newCat1, newCat2, newCat3, newPrep, newImagename, newThumbnailname, newRat, newCntPeople, newT);
	}
	
	/**
	 * Liefert Indexposition eines Rezepts in der XML
	 * @param id	Name des gesuchten Rezepts
	 * @return		Indexposition des gesuchten Rezepts
	 * 				'-1' wenn kein Eintrag gefunden 
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	@SuppressWarnings("unchecked")
	public int getIndex(String id) throws JDOMException, IOException {
		update();
		List<Element>componentList = new ArrayList<Element>();
		componentList = (List<Element>)root.getChildren("recipe");
		
		int i=0;
		for (Element comp : componentList) {
			if (comp.getChildText("id").equalsIgnoreCase(id)) {
				return i;
			}
			i++;
		}
		
		return -1;
	}
	
	/**
	 * Entfernt die Elemente mit dem angegebenen Namen
	 * @param remID	Name des zu entfernenden XML-Eintrags
	 * @throws IOException
	 * @throws JDOMException
	 */
	@SuppressWarnings("unchecked")
	public void remove(String remID) throws IOException, JDOMException {
		update();							//Wurzel aktualisieren
		List<Element>componentList = new ArrayList<Element>();		//neue Liste fuer XML-Elemente anlegen
		componentList = (List<Element>)root.getChildren("recipe");	//alle Children der Wurzel in Liste schreiben zur Bearbeitung 
		
		componentList.remove(getIndex(remID));	//Indexpos. des zu entfernenden Elements in XML ermitteln und aus Liste loeschen
		root.removeContent();				//und alle Child-Elemente entfernen = XML leer
		createXMLFile();
		System.out.println(root.getChildren());
		
		for (Element comp : componentList) {
			List<Element>ingList = new ArrayList<Element>();
			ingList = (List<Element>)comp.getChildren("ingredients");
			ArrayList<String>ingr = new ArrayList<String>();
			
			int id = Integer.parseInt(comp.getChildText("id"));
			String name = comp.getChildText("name"); 
			for (Element ing : ingList) {
				ingr.add(ing.getChildText("ingredient"));
			}
			String cat1 = comp.getChildText("category1"); 
			String cat2 = comp.getChildText("category2"); 
			String cat3 = comp.getChildText("category3"); 
			String prep = comp.getChildText("preperation"); 
			String imgname = comp.getChildText("imgname"); 
			String thumname = comp.getChildText("thumname"); 
			int rat = Integer.parseInt(comp.getChildText("rating")); 
			int people = Integer.parseInt(comp.getChildText("countPeople")); 
			String tags = comp.getChildText("tags"); 

			//neuen Listeninhalt in XML schreiben
			add(id,name,ingr,cat1,cat2,cat3,prep,imgname,thumname,rat,people,tags);		
		}
		//createXMLFile();
	}	
}

